home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / var / lib / dpkg / info / xfonts-75dpi.preinst < prev    next >
Text File  |  2009-05-11  |  31KB  |  929 lines

  1. #!/bin/sh
  2. # Debian xfonts-75dpi package pre-installation script
  3.  
  4. # $Id$
  5.  
  6. set -e
  7.  
  8. THIS_PACKAGE=xfonts-75dpi
  9. THIS_SCRIPT=preinst
  10.  
  11. # $Id$
  12.  
  13. # This is the X Strike Force shell library for X Window System package
  14. # maintainer scripts.  It serves to define shell functions commonly used by
  15. # such packages, and performs some error checking necessary for proper operation
  16. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  17. # invoke the functions defined here to accomplish package installation and
  18. # removal tasks.
  19.  
  20. # If you are reading this within a Debian package maintainer script (e.g.,
  21. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  22. # skip past this library by scanning forward in this file to the string
  23. # "GOBSTOPPER".
  24.  
  25. SOURCE_VERSION=1:1.0.0-4build1
  26. OFFICIAL_BUILD=
  27.  
  28. # Use special abnormal exit codes so that problems with this library are more
  29. # easily tracked down.
  30. SHELL_LIB_INTERNAL_ERROR=86
  31. SHELL_LIB_THROWN_ERROR=74
  32. SHELL_LIB_USAGE_ERROR=99
  33.  
  34. # old -> new variable names
  35. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  36.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  37. fi
  38. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  39.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  40. fi
  41.  
  42. # initial sanity checks
  43. if [ -z "$THIS_PACKAGE" ]; then
  44.   cat >&2 <<EOF
  45. Error: package maintainer script attempted to use shell library without
  46. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  47. version, and the text of this error message to the Debian Bug Tracking System.
  48. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  49. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  50. "doc-debian" package, or install the "reportbug" package and use the command of
  51. the same name to file a report against version $SOURCE_VERSION of this package.
  52. EOF
  53.   exit $SHELL_LIB_USAGE_ERROR
  54. fi
  55.  
  56. if [ -z "$THIS_SCRIPT" ]; then
  57.   cat >&2 <<EOF
  58. Error: package maintainer script attempted to use shell library without
  59. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  60. version, and the text of this error message to the Debian Bug Tracking System.
  61. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  62. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  63. "doc-debian" package, or install the "reportbug" package and use the command of
  64. the same name to file a report against version $SOURCE_VERSION of the
  65. "$THIS_PACKAGE" package.
  66. EOF
  67.   exit $SHELL_LIB_USAGE_ERROR
  68. fi
  69.  
  70. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  71.  
  72. LAPTOP=""
  73. if [ -n "$(which laptop-detect)" ]; then
  74.     if laptop-detect >/dev/null; then
  75.     LAPTOP=true
  76.     fi
  77. fi
  78.  
  79. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  80.   RECONFIGURE="true"
  81. else
  82.   RECONFIGURE=
  83. fi
  84.  
  85. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  86.   FIRSTINST="yes"
  87. fi
  88.  
  89. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  90.   UPGRADE="yes"
  91. fi
  92.  
  93. trap "message;\
  94.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  95.       message;\
  96.       exit 1" HUP INT QUIT TERM
  97.  
  98. reject_nondigits () {
  99.   # syntax: reject_nondigits [ operand ... ]
  100.   #
  101.   # scan operands (typically shell variables whose values cannot be trusted) for
  102.   # characters other than decimal digits and barf if any are found
  103.   while [ -n "$1" ]; do
  104.     # does the operand contain anything but digits?
  105.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  106.       # can't use die(), because it wraps message() which wraps this function
  107.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  108.            "possibly malicious garbage \"$1\"" >&2
  109.       exit $SHELL_LIB_THROWN_ERROR
  110.     fi
  111.     shift
  112.   done
  113. }
  114.  
  115. reject_whitespace () {
  116.   # syntax: reject_whitespace [ operand ]
  117.   #
  118.   # scan operand (typically a shell variable whose value cannot be trusted) for
  119.   # whitespace characters and barf if any are found
  120.   if [ -n "$1" ]; then
  121.     # does the operand contain any whitespace?
  122.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  123.       # can't use die(), because I want to avoid forward references
  124.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  125.            "possibly malicious garbage \"$1\"" >&2
  126.       exit $SHELL_LIB_THROWN_ERROR
  127.     fi
  128.   fi
  129. }
  130.  
  131. reject_unlikely_path_chars () {
  132.   # syntax: reject_unlikely_path_chars [ operand ... ]
  133.   #
  134.   # scan operands (typically shell variables whose values cannot be trusted) for
  135.   # characters unlikely to be seen in a path and which the shell might
  136.   # interpret and barf if any are found
  137.   while [ -n "$1" ]; do
  138.     # does the operand contain any funny characters?
  139.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  140.       # can't use die(), because I want to avoid forward references
  141.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  142.            "encountered possibly malicious garbage \"$1\"" >&2
  143.       exit $SHELL_LIB_THROWN_ERROR
  144.     fi
  145.     shift
  146.   done
  147. }
  148.  
  149. # Query the terminal to establish a default number of columns to use for
  150. # displaying messages to the user.  This is used only as a fallback in the
  151. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  152. # the script is running, and this cannot, only being calculated once.)
  153. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  154. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  155.   DEFCOLUMNS=80
  156. fi
  157.  
  158. message () {
  159.   # pretty-print messages of arbitrary length
  160.   reject_nondigits "$COLUMNS"
  161.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  162. }
  163.  
  164. observe () {
  165.   # syntax: observe message ...
  166.   #
  167.   # issue observational message suitable for logging someday when support for
  168.   # it exists in dpkg
  169.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  170.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  171.   fi
  172. }
  173.  
  174. warn () {
  175.   # syntax: warn message ...
  176.   #
  177.   # issue warning message suitable for logging someday when support for
  178.   # it exists in dpkg; also send to standard error
  179.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  180. }
  181.  
  182. die () {
  183.   # syntax: die message ...
  184.   #
  185.   # exit script with error message
  186.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  187.   exit $SHELL_LIB_THROWN_ERROR
  188. }
  189.  
  190. internal_error () {
  191.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  192.   message "internal error: $*"
  193.   if [ -n "$OFFICIAL_BUILD" ]; then
  194.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  195.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  196.             "Tracking System.  Include all messages above that mention the" \
  197.             "$THIS_PACKAGE package.  Visit " \
  198.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  199.             "instructions, read the file" \
  200.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  201.             "package, or install the reportbug package and use the command of" \
  202.             "the same name to file a report."
  203.   fi
  204.   exit $SHELL_LIB_INTERNAL_ERROR
  205. }
  206.  
  207. usage_error () {
  208.   message "usage error: $*"
  209.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  210.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  211.           "Tracking System.  Include all messages above that mention the" \
  212.           "$THIS_PACKAGE package.  Visit " \
  213.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  214.           "instructions, read the file" \
  215.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  216.           "package, or install the reportbug package and use the command of" \
  217.           "the same name to file a report."
  218.   exit $SHELL_LIB_USAGE_ERROR
  219. }
  220.  
  221.  
  222. maplink () {
  223.   # returns what symlink should point to; i.e., what the "sane" answer is
  224.   # Keep this in sync with the debian/*.links files.
  225.   # This is only needed for symlinks to directories.
  226.   #
  227.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  228.   # If we've stopped using this function, fixing it might enable us to re-enable
  229.   # it again and catch more errors.
  230.   case "$1" in
  231.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  232.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  233.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  234.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  235.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  236.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  237.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  238.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  239.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  240.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  241.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  242.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  243.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  244.     /usr/bin/X11) echo ../X11R6/bin ;;
  245.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  246.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  247.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  248.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  249.   esac
  250. }
  251.  
  252. analyze_path () {
  253.   # given a supplied set of pathnames, break each one up by directory and do an
  254.   # ls -dl on each component, cumulatively; i.e.
  255.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  256.   # Thanks to Randolph Chung for this clever hack.
  257.  
  258.   #local f g
  259.  
  260.   while [ -n "$1" ]; do
  261.     reject_whitespace "$1"
  262.     _g=
  263.     message "Analyzing $1:"
  264.     for _f in $(echo "$1" | tr / \  ); do
  265.       if [ -e /$_g$_f ]; then
  266.         ls -dl /$_g$_f /$_g$_f.dpkg-* 2> /dev/null || true
  267.         _g=$_g$_f/
  268.       else
  269.         message "/$_g$_f: nonexistent; directory contents of /$_g:"
  270.         ls -l /$_g
  271.         break
  272.       fi
  273.     done
  274.     shift
  275.   done
  276. }
  277.  
  278. find_culprits () {
  279.   #local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  280.   #  msg
  281.  
  282.   reject_whitespace "$1"
  283.   message "Searching for overlapping packages..."
  284.   _dpkg_info_dir=/var/lib/dpkg/info
  285.   if [ -d $_dpkg_info_dir ]; then
  286.     if [ "$(echo $_dpkg_info_dir/*.list)" != "$_dpkg_info_dir/*.list" ]; then
  287.       _possible_culprits=$(ls -1 $_dpkg_info_dir/*.list | egrep -v \
  288.         "(xbase-clients|x11-common|xfs|xlibs)")
  289.       if [ -n "$_possible_culprits" ]; then
  290.         _smoking_guns=$(grep -l "$1" $_possible_culprits || true)
  291.         if [ -n "$_smoking_guns" ]; then
  292.           _bad_packages=$(printf "\\n")
  293.           for f in $_smoking_guns; do
  294.             # too bad you can't nest parameter expansion voodoo
  295.             p=${f%*.list}      # strip off the trailing ".list"
  296.             _package=${p##*/}   # strip off the directories
  297.             _bad_packages=$(printf "%s\n%s" "$_bad_packages" "$_package")
  298.           done
  299.           _msg=$(cat <<EOF
  300. The following packages appear to have file overlaps with the X.Org packages;
  301. these packages are either very old, or in violation of Debian Policy.  Try
  302. upgrading each of these packages to the latest available version if possible:
  303. for example, with the command "apt-get install".  If no newer version of a
  304. package is available, you will have to remove it; for example, with the command
  305. "apt-get remove".  If even the latest available version of the package has
  306. this file overlap, please file a bug against that package with the Debian Bug
  307. Tracking System.  You may want to refer the package maintainer to section 12.8
  308. of the Debian Policy manual.
  309. EOF
  310. )
  311.           message "$_msg"
  312.           message "The overlapping packages are: $_bad_packages"
  313.         else
  314.           message "no overlaps found."
  315.         fi
  316.       fi
  317.     else
  318.       message "cannot search; no matches for $_dpkg_info_dir/*.list."
  319.     fi
  320.   else
  321.     message "cannot search; $_dpkg_info_dir does not exist."
  322.   fi
  323. }
  324.  
  325. # we require a readlink command or shell function
  326. if ! which readlink > /dev/null 2>&1; then
  327.   message "The readlink command was not found.  Please install version" \
  328.           "1.13.1 or later of the debianutils package."
  329.   readlink () {
  330.     # returns what symlink in $1 actually points to
  331.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  332.   }
  333. fi
  334.  
  335. check_symlink () {
  336.   # syntax: check_symlink symlink
  337.   #
  338.   # See if specified symlink points where it is supposed to.  Return 0 if it
  339.   # does, and 1 if it does not.
  340.   #
  341.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  342.  
  343.   #local symlink
  344.  
  345.   # validate arguments
  346.   if [ $# -ne 1 ]; then
  347.     usage_error "check_symlink() called with wrong number of arguments;" \
  348.                 "expected 1, got $#"
  349.     exit $SHELL_LIB_USAGE_ERROR
  350.   fi
  351.  
  352.   _symlink="$1"
  353.  
  354.   if [ "$(maplink "$_symlink")" = "$(readlink "$_symlink")" ]; then
  355.     return 0
  356.   else
  357.     return 1
  358.   fi
  359. }
  360.  
  361. check_symlinks_and_warn () {
  362.   # syntax: check_symlinks_and_warn symlink ...
  363.   #
  364.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  365.   #
  366.   # Call this function from a preinst script in the event $1 is "upgrade" or
  367.   # "install".
  368.  
  369.   #local errmsg symlink
  370.  
  371.   # validate arguments
  372.   if [ $# -lt 1 ]; then
  373.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  374.                 "arguments; expected at least 1, got $#"
  375.     exit $SHELL_LIB_USAGE_ERROR
  376.   fi
  377.  
  378.   while [ -n "$1" ]; do
  379.     _symlink="$1"
  380.     if [ -L "$_symlink" ]; then
  381.       if ! check_symlink "$_symlink"; then
  382.         observe "$_symlink symbolic link points to wrong location" \
  383.                 "$(readlink "$_symlink"); removing"
  384.         rm "$_symlink"
  385.       fi
  386.     elif [ -e "$_symlink" ]; then
  387.       _errmsg="$_symlink exists and is not a symbolic link; this package cannot"
  388.       _errmsg="$_errmsg be installed until this"
  389.       if [ -f "$_symlink" ]; then
  390.         _errmsg="$_errmsg file"
  391.       elif [ -d "$_symlink" ]; then
  392.         _errmsg="$_errmsg directory"
  393.       else
  394.         _errmsg="$_errmsg thing"
  395.       fi
  396.       _errmsg="$_errmsg is removed"
  397.       die "$_errmsg"
  398.     fi
  399.     shift
  400.   done
  401. }
  402.  
  403. check_symlinks_and_bomb () {
  404.   # syntax: check_symlinks_and_bomb symlink ...
  405.   #
  406.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  407.   #
  408.   # Call this function from a postinst script.
  409.  
  410.   #local problem symlink
  411.  
  412.   # validate arguments
  413.   if [ $# -lt 1 ]; then
  414.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  415.                 "arguments; expected at least 1, got $#"
  416.     exit $SHELL_LIB_USAGE_ERROR
  417.   fi
  418.  
  419.   while [ -n "$1" ]; do
  420.     _problem=
  421.     _symlink="$1"
  422.     if [ -L "$_symlink" ]; then
  423.       if ! check_symlink "$_symlink"; then
  424.         _problem=yes
  425.         warn "$_symlink symbolic link points to wrong location" \
  426.              "$(readlink "$_symlink")"
  427.       fi
  428.     elif [ -e "$_symlink" ]; then
  429.       _problem=yes
  430.       warn "$_symlink is not a symbolic link"
  431.     else
  432.       _problem=yes
  433.       warn "$_symlink symbolic link does not exist"
  434.     fi
  435.     if [ -n "$_problem" ]; then
  436.       analyze_path "$_symlink" "$(readlink "$_symlink")"
  437.       find_culprits "$_symlink"
  438.       die "bad symbolic links on system"
  439.     fi
  440.     shift
  441.   done
  442. }
  443.  
  444. font_update () {
  445.   # run $UPDATECMDS in $FONTDIRS
  446.  
  447.   #local dir cmd shortcmd x_font_dir_prefix
  448.  
  449.   _x_font_dir_prefix="/usr/share/fonts/X11"
  450.  
  451.   if [ -z "$UPDATECMDS" ]; then
  452.     usage_error "font_update() called but \$UPDATECMDS not set"
  453.   fi
  454.   if [ -z "$FONTDIRS" ]; then
  455.     usage_error "font_update() called but \$FONTDIRS not set"
  456.   fi
  457.  
  458.   reject_unlikely_path_chars "$UPDATECMDS"
  459.   reject_unlikely_path_chars "$FONTDIRS"
  460.  
  461.   for _dir in $FONTDIRS; do
  462.     if [ -d "$_x_font_dir_prefix/$_dir" ]; then
  463.       for _cmd in $UPDATECMDS; do
  464.         if which "$_cmd" > /dev/null 2>&1; then
  465.           _shortcmd=${_cmd##*/}
  466.           observe "running $_shortcmd in $_dir font directory"
  467.       _cmd_opts=
  468.           if [ "$_shortcmd" = "update-fonts-alias" ]; then
  469.             _cmd_opts=--x11r7-layout
  470.           fi
  471.           if [ "$_shortcmd" = "update-fonts-dir" ]; then
  472.             _cmd_opts=--x11r7-layout
  473.           fi
  474.           if [ "$_shortcmd" = "update-fonts-scale" ]; then
  475.             _cmd_opts=--x11r7-layout
  476.           fi
  477.           $_cmd $_cmd_opts $_dir || warn "$_cmd $_cmd_opts $_dir" \
  478.                               "failed; font directory data may not" \
  479.                               "be up to date"
  480.         else
  481.           warn "$_cmd not found; not updating corresponding $_dir font" \
  482.                "directory data"
  483.         fi
  484.       done
  485.     else
  486.       warn "$_dir is not a directory; not updating font directory data"
  487.     fi
  488.   done
  489. }
  490.  
  491. remove_conffile_prepare () {
  492.   # syntax: remove_conffile_prepare filename official_md5sum ...
  493.   #
  494.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  495.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  496.   # operands provided, then prepare the conffile for removal from the system.
  497.   # We defer actual deletion until the package is configured so that we can
  498.   # roll this operation back if package installation fails.
  499.   #
  500.   # Call this function from a preinst script in the event $1 is "upgrade" or
  501.   # "install" and verify $2 to ensure the package is being upgraded from a
  502.   # version (or installed over a version removed-but-not-purged) prior to the
  503.   # one in which the conffile was obsoleted.
  504.  
  505.   #local conffile current_checksum
  506.  
  507.   # validate arguments
  508.   if [ $# -lt 2 ]; then
  509.     usage_error "remove_conffile_prepare() called with wrong number of" \
  510.                 "arguments; expected at least 2, got $#"
  511.     exit $SHELL_LIB_USAGE_ERROR
  512.   fi
  513.  
  514.   _conffile="$1"
  515.   shift
  516.  
  517.   # does the _conffile even exist?
  518.   if [ -e "$_conffile" ]; then
  519.     # calculate its checksum
  520.     _current_checksum=$(md5sum < "$_conffile" | sed 's/[[:space:]].*//')
  521.     # compare it to each supplied checksum
  522.     while [ -n "$1" ]; do
  523.       if [ "$_current_checksum" = "$1" ]; then
  524.         # we found a match; move the confffile and stop looking
  525.         observe "preparing obsolete conffile $_conffile for removal"
  526.         mv "$_conffile" "$_conffile.$THIS_PACKAGE-tmp"
  527.         break
  528.       fi
  529.       shift
  530.     done
  531.   fi
  532. }
  533.  
  534. remove_conffile_commit () {
  535.   # syntax: remove_conffile_commit filename
  536.   #
  537.   # Complete the removal of a conffile "filename" that has become obsolete.
  538.   #
  539.   # Call this function from a postinst script after having used
  540.   # remove_conffile_prepare() in the preinst.
  541.  
  542.   #local conffile
  543.  
  544.   # validate arguments
  545.   if [ $# -ne 1 ]; then
  546.     usage_error "remove_conffile_commit() called with wrong number of" \
  547.                 "arguments; expected 1, got $#"
  548.     exit $SHELL_LIB_USAGE_ERROR
  549.   fi
  550.  
  551.   _conffile="$1"
  552.  
  553.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  554.   if [ -e "$_conffile.$THIS_PACKAGE-tmp" ]; then
  555.     observe "committing removal of obsolete conffile $_conffile"
  556.     rm "$_conffile.$THIS_PACKAGE-tmp"
  557.   fi
  558. }
  559.  
  560. remove_conffile_rollback () {
  561.   # syntax: remove_conffile_rollback filename
  562.   #
  563.   # Roll back the removal of a conffile "filename".
  564.   #
  565.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  566.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  567.   # preinst.
  568.  
  569.   #local conffile
  570.  
  571.   # validate arguments
  572.   if [ $# -ne 1 ]; then
  573.     usage_error "remove_conffile_rollback() called with wrong number of" \
  574.                 "arguments; expected 1, got $#"
  575.     exit $SHELL_LIB_USAGE_ERROR
  576.   fi
  577.  
  578.   _conffile="$1"
  579.  
  580.   # if the temporary file created by remove_conffile_prepare() exists, move it
  581.   # back
  582.   if [ -e "$_conffile.$THIS_PACKAGE-tmp" ]; then
  583.     observe "rolling back removal of obsolete conffile $_conffile"
  584.     mv "$_conffile.$THIS_PACKAGE-tmp" "$_conffile"
  585.   fi
  586. }
  587.  
  588. replace_conffile_with_symlink_prepare () {
  589.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  590.   # official_md5sum ...
  591.   #
  592.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  593.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  594.   # operands provided, then prepare the conffile for removal from the system.
  595.   # We defer actual deletion until the package is configured so that we can
  596.   # roll this operation back if package installation fails. Otherwise copy it
  597.   # to newfilename and let dpkg handle it through conffiles mechanism.
  598.   #
  599.   # Call this function from a preinst script in the event $1 is "upgrade" or
  600.   # "install" and verify $2 to ensure the package is being upgraded from a
  601.   # version (or installed over a version removed-but-not-purged) prior to the
  602.   # one in which the conffile was obsoleted.
  603.  
  604.   #local conffile current_checksum
  605.  
  606.   # validate arguments
  607.   if [ $# -lt 3 ]; then
  608.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  609.                 " number of arguments; expected at least 3, got $#"
  610.     exit $SHELL_LIB_USAGE_ERROR
  611.   fi
  612.  
  613.   _oldconffile="$1"
  614.   shift
  615.   _newconffile="$1"
  616.   shift
  617.  
  618.   remove_conffile_prepare "$_oldconffile" "$@"
  619.   # If $_oldconffile still exists, then md5sums didn't match.
  620.   # Copy it to new one.
  621.   if [ -f "$_oldconffile" ]; then
  622.     cp "$_oldconffile" "$_newconffile"
  623.   fi
  624.  
  625. }
  626.  
  627. replace_conffile_with_symlink_commit () {
  628.   # syntax: replace_conffile_with_symlink_commit oldfilename
  629.   #
  630.   # Complete the removal of a conffile "oldfilename" that has been
  631.   # replaced by a symlink.
  632.   #
  633.   # Call this function from a postinst script after having used
  634.   # replace_conffile_with_symlink_prepare() in the preinst.
  635.  
  636.   #local conffile
  637.  
  638.   # validate arguments
  639.   if [ $# -ne 1 ]; then
  640.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  641.                 "number of arguments; expected 1, got $#"
  642.     exit $SHELL_LIB_USAGE_ERROR
  643.   fi
  644.  
  645.   _conffile="$1"
  646.  
  647.   remove_conffile_commit "$_conffile"
  648. }
  649.  
  650. replace_conffile_with_symlink_rollback () {
  651.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  652.   #
  653.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  654.   # "newfilename".
  655.   #
  656.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  657.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  658.   # from a version (or install over a version removed-but-not-purged) prior
  659.   # to the one in which the conffile was obsoleted.
  660.   # You should have  used replace_conffile_with_symlink_prepare() in the
  661.   # preinst.
  662.  
  663.   #local conffile
  664.  
  665.   # validate arguments
  666.   if [ $# -ne 2 ]; then
  667.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  668.                 "number of arguments; expected 2, got $#"
  669.     exit $SHELL_LIB_USAGE_ERROR
  670.   fi
  671.  
  672.   _oldconffile="$1"
  673.   _newconffile="$2"
  674.  
  675.   remove_conffile_rollback "$_oldconffile"
  676.   if [ -f "$_newconffile" ]; then
  677.     rm "$_newconffile"
  678.   fi
  679. }
  680.  
  681. run () {
  682.   # syntax: run command [ argument ... ]
  683.   #
  684.   # Run specified command with optional arguments and report its exit status.
  685.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  686.   # or commands whose failure is not fatal to us.
  687.   #
  688.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  689.   # those cases the return value of the debconf command *must* be checked
  690.   # before the string returned by debconf is used for anything.
  691.  
  692.   #local retval
  693.  
  694.   # validate arguments
  695.   if [ $# -lt 1 ]; then
  696.     usage_error "run() called with wrong number of arguments; expected at" \
  697.                 "least 1, got $#"
  698.     exit $SHELL_LIB_USAGE_ERROR
  699.   fi
  700.  
  701.   "$@" || _retval=$?
  702.  
  703.   if [ ${_retval:-0} -ne 0 ]; then
  704.     observe "command \"$*\" exited with status $_retval"
  705.   fi
  706. }
  707.  
  708. register_x_lib_dir_with_ld_so () {
  709.   # syntax: register_x_lib_dir_with_ld_so
  710.   #
  711.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  712.   # libraries.
  713.   #
  714.   # Call this function from the postinst script of a package that places a
  715.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  716.  
  717.   #local dir ldsoconf
  718.  
  719.   _dir="/usr/X11R6/lib"
  720.   _ldsoconf="/etc/ld.so.conf"
  721.  
  722.   # is the line not already present?
  723.   if ! fgrep -qsx "$_dir" "$_ldsoconf"; then
  724.     observe "adding $_dir directory to $_ldsoconf"
  725.     echo "$_dir" >> "$_ldsoconf"
  726.   fi
  727. }
  728.  
  729. deregister_x_lib_dir_with_ld_so () {
  730.   # syntax: deregister_x_lib_dir_with_ld_so
  731.   #
  732.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  733.   # libraries, if and only if no shared libaries remain there.
  734.   #
  735.   # Call this function from the postrm script of a package that places a shared
  736.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  737.   # invoking ldconfig.
  738.  
  739.   #local dir ldsoconf fgrep_status cmp_status
  740.  
  741.   _dir="/usr/X11R6/lib"
  742.   _ldsoconf="/etc/ld.so.conf"
  743.  
  744.   # is the line present?
  745.   if fgrep -qsx "$_dir" "$_ldsoconf"; then
  746.     # are there any shared objects in the directory?
  747.     if [ "$(echo "$_dir"/lib*.so.*.*)" = "$_dir/lib*.so.*.*" ]; then
  748.       # glob expansion produced nothing, so no shared libraries are present
  749.       observe "removing $_dir directory from $_ldsoconf"
  750.       # rewrite the file (very carefully)
  751.       set +e
  752.       fgrep -svx "$_dir" "$_ldsoconf" > "$_ldsoconf.dpkg-tmp"
  753.       _fgrep_status=$?
  754.       set -e
  755.       case $_fgrep_status in
  756.         0|1) ;; # we don't actually care if any lines matched or not
  757.         *) die "error reading \"$_ldsoconf\"; fgrep exited with status" \
  758.           "$_fgrep_status" ;;
  759.       esac
  760.       set +e
  761.       cmp -s "$_ldsoconf.dpkg-tmp" "$_ldsoconf"
  762.       _cmp_status=$?
  763.       set -e
  764.       case $_cmp_status in
  765.         0) rm "$_ldsoconf.dpkg-tmp" ;; # files are identical
  766.         1) mv "$_ldsoconf.dpkg-tmp" "$_ldsoconf" ;; # files differ
  767.         *) die "error comparing \"$_ldsoconf.dpkg-tmp\" to \"$_ldsoconf\";" \
  768.           "cmp exited with status $_cmp_status" ;;
  769.       esac
  770.     fi
  771.   fi
  772. }
  773.  
  774. make_symlink_sane () {
  775.   # syntax: make_symlink_sane symlink target
  776.   #
  777.   # Ensure that the symbolic link symlink exists, and points to target.
  778.   #
  779.   # If symlink does not exist, create it and point it at target.
  780.   #
  781.   # If symlink exists but is not a symbolic link, back it up.
  782.   #
  783.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  784.   # it.
  785.   #
  786.   # If symlink exists, is a symbolic link, and already points to target, do
  787.   # nothing.
  788.   #
  789.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  790.  
  791.   # Validate arguments.
  792.   if [ $# -ne 2 ]; then
  793.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  794.       "expected 2, got $#"
  795.     exit $SHELL_LIB_USAGE_ERROR
  796.   fi
  797.  
  798.   # We could just use the positional parameters as-is, but that makes things
  799.   # harder to follow.
  800.   #local symlink target
  801.  
  802.   _symlink="$1"
  803.   _target="$2"
  804.  
  805.   if [ -L "$_symlink" ] && [ "$(readlink "$_symlink")" = "$_target" ]; then
  806.       observe "link from $_symlink to $_target already exists"
  807.   else
  808.     observe "creating symbolic link from $_symlink to $_target"
  809.     mkdir -p "${_target%/*}" "${_symlink%/*}"
  810.     ln -s -b -S ".dpkg-old" "$_target" "$_symlink"
  811.   fi
  812. }
  813.  
  814. migrate_dir_to_symlink () {
  815.   # syntax: migrate_dir_to_symlink old_location new_location
  816.   #
  817.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  818.   # symbolic link to a directory or vice versa; instead, the existing state
  819.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  820.   # there is one."
  821.   #
  822.   # We have to do it ourselves.
  823.   #
  824.   # This function moves the contents of old_location, a directory, into
  825.   # new_location, a directory, then makes old_location a symbolic link to
  826.   # new_location.
  827.   #
  828.   # old_location need not exist, but if it does, it must be a directory (or a
  829.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  830.   # exists already and is not a directory, it is backed up.
  831.   #
  832.   # This function should be called from a package's preinst so that other
  833.   # packages unpacked after this one --- but before this package's postinst runs
  834.   # --- are unpacked into new_location even if their payloads contain
  835.   # old_location filespecs.
  836.  
  837.   # Validate arguments.
  838.   if [ $# -ne 2 ]; then
  839.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  840.                 "arguments; expected 2, got $#"
  841.     exit $SHELL_LIB_USAGE_ERROR
  842.   fi
  843.  
  844.   # We could just use the positional parameters as-is, but that makes things
  845.   # harder to follow.
  846.   local _new _old
  847.  
  848.   _old="$1"
  849.   _new="$2"
  850.  
  851.   # Is old location a symlink?
  852.   if [ -L "$_old" ]; then
  853.     # Does it already point to new location?
  854.     if [ "$(readlink "$_old")" = "$_new" ]; then
  855.       # Nothing to do; migration has already been done.
  856.       observe "migration of $_old to $_new already done"
  857.       return 0
  858.     else
  859.       # Back it up.
  860.       warn "backing up symbolic link $_old as $_old.dpkg-old"
  861.       mv -b "$_old" "$_old.dpkg-old"
  862.     fi
  863.   fi
  864.  
  865.   # Does old location exist, but is not a directory?
  866.   if [ -e "$_old" ] && ! [ -d "$_old" ]; then
  867.       # Back it up.
  868.       warn "backing up non-directory $_old as $_old.dpkg-old"
  869.       mv -b "$_old" "$_old.dpkg-old"
  870.   fi
  871.  
  872.   observe "migrating $_old to $_new"
  873.  
  874.   # Is new location a symlink?
  875.   if [ -L "$_new" ]; then
  876.     # Does it point the wrong way, i.e., back to where we're migrating from?
  877.     if [ "$(readlink "$_new")" = "$_old" ]; then
  878.       # Get rid of it.
  879.       observe "removing symbolic link $_new which points to $_old"
  880.       rm "$_new"
  881.     else
  882.       # Back it up.
  883.       warn "backing up symbolic link $_new as $_new.dpkg-old"
  884.       mv -b "$_new" "$_new.dpkg-old"
  885.     fi
  886.   fi
  887.  
  888.   # Does new location exist, but is not a directory?
  889.   if [ -e "$_new" ] && ! [ -d "$_new" ]; then
  890.     warn "backing up non-directory $_new as $_new.dpkg-old"
  891.     mv -b "$_new" "$_new.dpkg-old"
  892.   fi
  893.  
  894.   # Create new directory if it does not yet exist.
  895.   if ! [ -e "$_new" ]; then
  896.     observe "creating $_new"
  897.     mkdir -p "$_new"
  898.   fi
  899.  
  900.   # Copy files in old location to new location.  Back up any filenames that
  901.   # already exist in the new location with the extension ".dpkg-old".
  902.   observe "copying files from $_old to $_new"
  903.   if ! (cd "$_old" && cp -a -b -S ".dpkg-old" . "$_new"); then
  904.     die "error(s) encountered while copying files from $_old to $_new"
  905.   fi
  906.  
  907.   # Remove files at old location.
  908.   observe "removing $_old"
  909.   rm -r "$_old"
  910.  
  911.   # Create symlink from old location to new location.
  912.   make_symlink_sane "$_old" "$_new"
  913. }
  914.  
  915. # vim:set ai et sw=2 ts=2 tw=80:
  916.  
  917. # GOBSTOPPER: The X Strike Force shell library ends here.
  918.  
  919. if [ "$1" = "install" ] || [ "$1" = "upgrade" ]; then
  920.   if dpkg --compare-versions "$2" lt "1:1.0.0-3"; then
  921.     remove_conffile_prepare /etc/X11/fonts/X11R7/75dpi/xfonts-75dpi.alias \
  922.       6bc48023f2ae7f3bfc105db7b0ee6b49
  923.   fi
  924. fi
  925.       
  926. exit 0
  927.  
  928. # vim:ai:et:sts=2:sw=2:tw=0:
  929.